שתי הגדרות פשוטות יעזרו לך למנוע את גנבת הסשן מהאתר שלך וימנעו אפשרות של התחזות.
איך גונבים זהות? על ידי גניבת סשן
כולנו משתמשים בסשן על מנת לזהות את הגולש שמחובר לאתר. בא משתמש, התחבר, רשמנו בסשן את ה-ID שלו, ולפי מזהה הסשן שלו נדע בכל טעינת עמוד שהוא – אכן הוא. כל זה עובד בצורה מדהימה עד הרגע שבו מישהו אחר מגלה את מזהה הסשן שלי וגולש לאתר עם המזהה שלי.
המזהה הזה, sessionid, נשלח בכל בקשה מהדפדפן לשרת ביחד עם שאר הקוקיז, כמו שראינו בהסבר על Session. בדיוק אל אותם הקוקיז אפשר לגשת גם דרך JavaScript באמצעות הפקודה document.cookie.
מה זה אומר?
זה אומר שפיספסנו חור XSS אחד קטן היכן שהוא באתר, ומישהו זדוני יכול לדחוף לשם קוד JavaScript שגונב לנו את הקוקי ושולח לו, כדי שהוא יוכל אחרי זה להזדהות בתור מישהו אחר באתר שלנו.
אתה יכול לשאול את עצמך – אם קוקיז הם כאלה חשובים והם המפתח לממלכת ההזדהות, למה הדפדפנים לא מגנים בצורה טובה יותר על הקוקיז? למזלנו – הם כן.
httpOnly
מי שפעם ראה את הדוקומנטציה של set_cookie שם לב שבסוף הרשימה מופיע פרמטר רשות וכנראה לא חשוב בשם httponly.
bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] )
נשמע מוזר, לא ברור, וקוקיז עובדים לי טוב מאוד בלי זה... במה בכלל מדובר?
כשאתה מסמן קוקי בתור httpOnly, אתה אומר לדפדפן שהקוקי הספציפי הזה צריך להיות נגיש אך ורק לשרת המקורי. פעולה זו גורמת לדפדפן להחביא את הקוקי מקוד ה-JavaScript, בהנחה שמדובר בדפדפן עדכני יחסית.
וכאן מתגלה הבעיה השנייה:
את הקוקי עם מזהה הסשן לא אנחנו מייצרים
הקוקי בשם PHPSESSID נוצר ונשלח אוטומטית על ידי PHP בלי הבקרה הישירה שלנו. אבל זה נכון רק חלקית; לנו יש בקרה מלאה על קובץ בשם php.ini, שבו נמצאות שתי ההגדרות הבאות:
session.use_only_cookies = 1
session.cookie_httponly =
session.cookie_httponly =
session.use_only_cookies
session.use_only_cookies אומר ל-PHP שסשנים צריכים לעבוד אך ורק דרך קוקי. אם נשים אפס בתור ערך זה, PHP תצרף פרמטר עם מזהה של סשן לכל קישור באתר, כמו http://phpguide.co.il/?PHPSESSID=abc123. להוציא את ערך הקוקי מתוך הכתובת באמצעות JavaScript זה עניין של שתי שורות קוד. מעבר לכך, המתשמש יכול לעזור למישהו לגנוב את הקוקי של עצמו על ידי העתקת הקישור ומסירתו למישהו, או פרסומו באינטרנט עם הכותרת "קבלו איזה אתר מדליק". כל הדפדפנים המודרניים תומכים בקוקיז בצורה מלאה, והערך הבטיחותי עבור אופציה זו הוא 1, שזו אופציית ברירת המחדל.
session.cookie_httponly
אופציה זו אמורה להיות מובנת לכם מהשם שלה, וכאן הבעיה היא דווקא בערך ברירת המחדל, שפשוט לא נמצא שם ומוחשב ל-0, כלומר כבוי. את הערך הזה עלינו לשנות ל-1 כדי לזכות בשיפור האבטחה.
בנוסף, את ההגדרה הזו אפשר לשנות לא רק ב php.ini אלה גם בקובץ htaccess. בצורה הבאה:
php_value session.cookie_httponly On
בונוס
session.name
session.name זה שם הקוקי שבו PHP תשתמש בתור מזהה הסשן. ערך ברירת המחדל שלה הוא PHPSESSID.
מומלץ מאוד לשנות את הערך הזה לערך אחר כדי למנוע מכל מיני בוטים וסקריפטים אוטומטיים שמגיעים לאתר שלכם לגרום נזק, כיוון שרובם מוגדרים לחפש באתר מישהו או משהו עם המילים PHPSESSID. הערך שתשימו כאן לא משנה בכלל, העיקר שיהיה שונה מההגדרות הרגילות שאליהם מכוונים בוטים עצבניים.
אחרי כל השינויים לא שוכחים לעשות ריסטרט לשרת כדי שהשינויים ייכנסו לפועל.
אפשר לעשות את זה גם ב-Wamp, אבל אני מקווה שאל האתר שלכם שמאוחסן ב-Wamp לא גולשים אנשים אחרים ומנסים לעשות כל מיני שטויות. חשוב שחברת האכסון שלכם תעשה את השינויים האלה בהקדם.
תגובות לכתבה:
ידוע ושימושי, היה חסר דגש בנושא.
תודה רבה על המדריך, לא הכרתי את הנושא.
אני רואה שאתה בעצמך לא מימשת את ההצעה.. :)
השארתי את זה ליותר מאוחר בלילה, כאשר לא יהיו גולשים ואוכל לשנות את מזהה הסשן,
אחרת אנשים יתנתקו מהאתר באמצע הגלישה שלהם.
"כולנו משתמשים בסשן על מנת לזהות את הגולש שמחובר לאתר"
למה לעשות דבר כזה..??
אני פשוט בודק אם הקוקי קיים ומשווה אותו למסד ,לא ככה עושים??
אם לא אתה יכול להסביר חסרונות בשימוש בקוקי בלבד בבקשה.
המשתמש, שיכול להיות גם האקר, יכול לגשת לקוקי ולשנות אותו...
הדבר היחידי שבעייתי אצלי זה שדרך הגוגול כרום אפשר לראות את הקוקי
אבל אי אפשר לערוך ,אפשר רק למחוק אותו ולראות מה הערך שלו..
אתה בטוח שאפשר לשנות קוקי דרך המחשב??
הקוקי שמור על המחשב, הוא קובץ רגיל לגמרי ואתה יכול לערוך מתי שבא לך.
יש גם הרבה תוספים לגוגל כרום שאפשר לשנות בהם קוקיז
אם אתה רוצה לשנות משהו במחשב שלך - לך על זה.
אבל אם מישהו אחר ישים באתר הזה סקריפט שמנסה לקרוא את הקוקי שלך - הוא לא יצליח, כיוון שהסשן קוקי של האתר לא נגיש עבור אותו בן אדם.
אני לא מבין במה זה פוגע..
על מנת שזה באמת יעבוד המשתמש אמור להכניס קוקי וסיסמא נכונים ואם הוא ייעשה את זה בJS אז מה ההבדל??..
חוץ מזה אני מברר טיפה עכשיו על HTTPONLY..
תדע לך שיכול להיות שזה הבעיה שבגללה האתר שלך מנתק אותי לפעמים..
בכל מקרה FXP לא עושים ככה ועוד המון אתרים אז זה לא נראה לי הכרחי..
בFXP זה מערכת פורומים מוכנה.
אצלם החיבורים עובדים על המסד נתונים.
זה עובד כמו שסן
רק שהנתונים נכנסים למסד נתונים.(במקום שנשמרים לשרת)
וגם ה IP.
ככה שרק מי שיש לו את אותו IP יכול להתחבר.
fxp לא מסתמכים רק על ה-IP. הייתי אומר שזה הפקטור האחרון שצריך להסתמך עליו.
הערות:
1. בהנחה שהאתר עובד עם AJAX, ברגע שהסשן httpOnly אין אפשרות לעקוב אחרי המשתמש. (תקנו אותי אם אני טועה)
2. למי שאין גישה לphp.ini אפשר להגדיר גם דרך htaccess עם מוד php:
php_value session.cookie_httponly On
מאמר איכותי, תודה רבה.
1. דפדפנים שולחים את הקוקי לשרת גם בבקשות ajax ובכל זאת מחביאים אותו מקוד javascript (כולל getResponseHeader ) ככה שהכל בסדר.
2. נכון. ברשותך הוסיף את זה גם לתוכן הכתבה
לא הבנתי כ"כ איפה אני מסמן את הקוקי כ httpOnly.
ואם אני בכלל לא משתמש בקוקי אלא רק בסשנים, זה תקף ?
בקובץ php.ini שלך, או בקובץ htaccess.
תקרא קצת על סשנים ואז תראה. :-) (רמז: במה זה משתמש?)
סתם מיהרתי לכתוב תגובה מבלי להעמיק בקריאה. עכשיו שמתי לב ששאלתי שאלות כ"כ מטופשות.
תודה:).
זה בסדר. קורה לכולם. :-)